home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
076-100
/
084
/
gravitywars
/
options.mod
< prev
next >
Wrap
Text File
|
1995-03-13
|
9KB
|
312 lines
IMPLEMENTATION MODULE Options;
(*+,+*)
(**********************************************************************
*************** Written by Ed Bartz ***************
*************** Copyright 5/21/87 ***************
*************** This program may be redistributed ***************
*************** or modified as long as these ***************
*************** notices and all other references ***************
*************** to the author remain intack. ***************
*************** Also this may not be used for ***************
*************** profit by anyone without the ***************
*************** express permission of the author. ***************
**********************************************************************)
FROM Intuition IMPORT
IntuitionName, IntuitionBase, WindowPtr, ScreenPtr, Menu, Window,
ItemFlagSet, ItemEnabled, MenuToggle, MenuItem, ItemText;
FROM RandomNumbers IMPORT Random;
FROM MathLib0 IMPORT real,entier,sqrt;
FROM GW IMPORT
Pl, Mdata, Shell, DrawPlanet, Distance, Stars, DrawLine,
DrawShip;
FROM MyWindow IMPORT
OpenIOWin, CloseIOWin, ReadMouse;
FROM Rasters IMPORT SetRast;
FROM Console IMPORT
OpenRConsole, CloseRConsole, PutChar, PutStr, GetChar, GetStr,
QueueRead, Conport;
FROM M2Conversions IMPORT
ConvertCardinal, ConvertReal, ConvertToReal, ConvertToCardinal;
FROM Pens IMPORT SetAPen, WritePixel, ReadPixel;
PROCEDURE DeletePlanet(wp: WindowPtr;VAR pl: ARRAY OF Pl;VAR Pnum: CARDINAL);
VAR
i,x,y : CARDINAL;
BEGIN
ReadMouse(wp,x,y);
i:= IdentifyP(x,y,Pnum,pl);
DeletePlanet1(wp,pl,i,Pnum);
END DeletePlanet;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE MakePlanet(wp: WindowPtr;VAR Sh,pl: ARRAY OF Pl;VAR Pnum,ptype: CARDINAL);
VAR
ok : BOOLEAN;
density,i,x,y : CARDINAL;
temp : Pl;
r3 : REAL;
mass : ARRAY [0..2] OF REAL;
BEGIN
mass[0]:=0.02;
mass[1]:=0.025;
mass[2]:=0.03;
ReadMouse(wp,x,y);
i:= Pnum;
IF i<15 THEN
pl[i].x:=x;
pl[i].y:=y;
ReadMouse(wp,x,y);
temp.x:=x;
temp.y:=y;
pl[i].r:= Distance(pl[i],temp);
IF pl[i].r>255 THEN pl[i].r :=255; END;
r3:= real(pl[i].r);
IF Room(pl,Sh,pl[i],Pnum,0) THEN
r3:=r3*r3*r3;
density:= Random(3);
pl[i].color:= (density*4)+4;
pl[i].m:=r3*mass[density];
WITH pl[i] DO
DrawPlanet(x,y,r,color,ptype,wp);
END;
Pnum:=i+1;
END;
END;
END MakePlanet;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE ChangePlanet(wp: WindowPtr;VAR pl: ARRAY OF Pl;Pnum,ptype: CARDINAL);
VAR
c,x,y,i : CARDINAL;
BEGIN
ReadMouse(wp,x,y);
i:= IdentifyP(x,y,Pnum,pl);
c:= pl[i].color;
IF c=4 THEN c:=8;
ELSE IF c=8 THEN c:=12;
ELSE IF c=12 THEN c:=4; END;
END;
END;
pl[i].color:=c;
WITH pl[i] DO
DrawPlanet(x,y,r,color,ptype,wp);
END;
END ChangePlanet;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE MoveShip(wp: WindowPtr;VAR Sh,pl: ARRAY OF Pl;Pnum :CARDINAL);
VAR
x,y,i : CARDINAL;
c : CHAR;
ok : BOOLEAN;
temp : Pl;
BEGIN
ReadMouse(wp,x,y);
i:= IdentifyS(x,y,Sh);
IF i< 2 THEN
deleteship(wp,Sh[i]);
ReadMouse(wp,x,y);
temp.x:=x;
temp.y:=y;
temp.r:=Sh[i].r;
ok:= Room(pl,Sh,temp,Pnum,(1+i));
IF ok THEN
Sh[i].x:= x;
Sh[i].y:= y;
END;
DrawShip(Sh[0].x,Sh[0].y,Sh[1].x,Sh[1].y,wp);
END;
END MoveShip;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE deleteship(wp: WindowPtr; p: Pl);
CONST
round = 0.83;
VAR
i,j,k,itr,nx,ny,x1,x2,y1,y2 : INTEGER;
BEGIN
WITH p DO
FOR ny:=0 TO 7 DO
x1:=x-18;
x2:=x+18;
y1:=y-ny;
y2:=y+ny;
IF x1<0 THEN x1:=0; END;
IF y1<0 THEN y1:=0; END;
IF x2>639 THEN x2:=639; END;
IF y2>399 THEN y2:=399; END;
DrawLine(x1,y1,x2,y1,0,wp);
DrawLine(x1,y2,x2,y2,0,wp);
END;
SetAPen(wp^.RPort,1);
FOR i:= 0 TO 3 DO
j:= INTEGER(Random(36))-18;
k:= INTEGER(Random(14))-7;
itr:= ReadPixel(wp^.RPort,x+j,y+k);
IF itr=0 THEN
WritePixel(wp^.RPort,x+j,y+k);
END;
END;
END;
END deleteship;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE MovePlanet(wp: WindowPtr;VAR Sh,pl: ARRAY OF Pl;Pnum,ptype :CARDINAL);
VAR
x,y,i : CARDINAL;
temp,temp1 : Pl;
ok : BOOLEAN;
BEGIN
ReadMouse(wp,x,y);
i:= IdentifyP(x,y,Pnum,pl);
temp1.x:= pl[i].x;
temp1.y:= pl[i].y;
temp1.r:= pl[i].r;
temp1.color:= pl[i].color;
temp1.m:= pl[i].m;
DeletePlanet1(wp,pl,i,Pnum);
ReadMouse(wp,x,y);
temp.x:=x;
temp.y:=y;
temp.r:=temp1.r;
ok:= Room(pl,Sh,temp,Pnum,0);
IF ok THEN
pl[Pnum].x:= x;
pl[Pnum].y:= y;
ELSE
pl[Pnum].x:=temp1.x;
pl[Pnum].y:=temp1.y;
END;
pl[Pnum].r:=temp1.r;
pl[Pnum].m:=temp1.m;
pl[Pnum].color:=temp1.color;
WITH pl[Pnum] DO
DrawPlanet(x,y,r,color,ptype,wp);
END;
Pnum:=Pnum+1;
END MovePlanet;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE DeletePlanet1(wp: WindowPtr;VAR p: ARRAY OF Pl;VAR l,Pnum:CARDINAL);
CONST
round = 0.83;
VAR
i,j,k,itr,nx,ny : INTEGER;
BEGIN
IF Pnum#0 THEN
WITH p[l] DO
DrawPlanet(x,y,r,1,0,wp);
SetAPen(wp^.RPort,1);
FOR i:= 0 TO (r DIV 5) DO
j:= INTEGER(Random(2*r))-r;
k:= INTEGER(Random(2*r))-r;
itr:= ReadPixel(wp^.RPort,x+j,y+k);
IF itr=0 THEN
WritePixel(wp^.RPort,x+j,y+k);
END;
END;
END;
Pnum:= Pnum-1;
FOR i:= l TO Pnum-1 DO
p[i].x:= p[i+1].x;
p[i].y:= p[i+1].y;
p[i].r:= p[i+1].r;
p[i].m:= p[i+1].m;
p[i].color:= p[i+1].color;
END;
END;
END DeletePlanet1;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE CleanScreen (wp: WindowPtr;VAR Sh,pl: ARRAY OF Pl;Pnum,ptype: CARDINAL);
VAR
i : CARDINAL;
BEGIN
SetRast(wp^.RPort,0);
Stars(wp);
DrawShip(Sh[0].x,Sh[0].y,Sh[1].x,Sh[1].y,wp);
WHILE (Pnum>0) DO
Pnum:= Pnum-1;
WITH pl[Pnum] DO
DrawPlanet(x,y,r,color,ptype,wp);
END;
END;
END CleanScreen;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE IdentifyP(x,y,Pnum: CARDINAL; VAR pl: ARRAY OF Pl): CARDINAL;
VAR
j,l : INTEGER;
Mouse : Pl;
i,k : CARDINAL;
BEGIN
Mouse.x := INTEGER(x);
Mouse.y := INTEGER(y);
j:= 10000;
k:= 100;
FOR i:= 0 TO (Pnum-1) DO
l:=Distance(Mouse,pl[i]);
IF j > ABS(l) THEN
k:= i;
j:= ABS(l);
END;
END;
RETURN k;
END IdentifyP;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE IdentifyS(x,y: CARDINAL; VAR Sh: ARRAY OF Pl): CARDINAL;
VAR
j,l : INTEGER;
Mouse : Pl;
i,k : CARDINAL;
BEGIN
Mouse.x := INTEGER(x);
Mouse.y := INTEGER(y);
j:= 10000;
k:= 100;
FOR i:= 0 TO 1 DO
l:=Distance(Mouse,Sh[i]);
IF j > ABS(l) THEN
k:= i;
j:= ABS(l);
END;
END;
IF j<50 THEN
RETURN k;
ELSE
RETURN 2;
END;
END IdentifyS;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE Room(VAR Pln,Sh: ARRAY OF Pl;new: Pl;Pn,sh: CARDINAL): BOOLEAN;
VAR
i,k : INTEGER;
ok : BOOLEAN;
BEGIN
ok:=TRUE;
FOR k:=0 TO (Pn-1) DO
i:= Distance(Pln[k],new);
IF (i<(Pln[k].r+new.r)) THEN ok:=FALSE;END;
END;
IF sh<1 THEN
FOR k:=0 TO 1 DO
i:= Distance(Sh[k],new);
IF (i<(Sh[k].r+new.r)) THEN ok:=FALSE;END;
END;
ELSE
i:= Distance(Sh[1-(sh-1)],new);
IF (i<(Sh[1-(sh-1)].r+new.r)) THEN ok:=FALSE;END;
END;
RETURN ok;
END Room;
END Options.